﻿//using Avalonia.Controls;
//using Avalonia.Controls.Documents;
//using Avalonia.Input;
//using Avalonia.OpenGL;
//using Avalonia.OpenGL.Controls;
//using Silk.NET.OpenGLES;
//using System;
//using System.Collections.Generic;
//using System.Linq;
//using System.Numerics;
//using System.Text;
//using System.Threading.Tasks;
//using TTEngine.Graphics;
//using TTEngine.Impl.Desktop;
//using IGLES = Silk.NET.OpenGLES.GL;
////avalonia 存在多个GLView时，并不能按照预期工作
//namespace TTEngine.Impl.Avalonia
//{
//    public class GLView : OpenGlControlBase, IView
//    {
//        public Vector2 Center
//        {
//            get
//            {
//                return new Vector2((this as ISize).Width / 2, (this as ISize).Height / 2);
//            }
//        }
//        public IGameWindow TryGetWindow()
//        {
//            return null;
//        }
//        public GLView()
//        {
//            RenderInfo = new RenderInfo();
//        }
//        public RenderInfo RenderInfo
//        {
//            get;
//            private set;
//        }

//        Silk.NET.OpenGLES.GL _gles;
//        public IInput input
//        {
//            get
//            {
//                return _input;
//            }
//        }
//        public GL GL => _gles;

//        public float Scale => (float)this.VisualRoot.RenderScaling;

//        public Action OnRender { get; set; }
//        public Action<float> OnUpdate { get; set; }
//        public Action<int, int> OnResize { get; set; }

//        uint ISize.Width => (uint)(this.Bounds.Width * Scale);

//        uint ISize.Height => (uint)(this.Bounds.Height * Scale);

//        public Window GetWindow()
//        {
//            var p = this.Parent;

//            while (p is not Window)
//            {
//                p = p.Parent;
//            }
//            return p as Window;
//        }
//        Impl_Input _input;
//        protected override void OnOpenGlInit(GlInterface gl)
//        {

//            base.OnOpenGlInit(gl);

//            _gles = GL.GetApi(gl.GetProcAddress);

//            if (TTEngine.API.platform == null) TTEngine.API.platform = new Platform();
//            if (TTEngine.API.audio == null) TTEngine.API.audio = new Impl_Audio();
//            if (TTEngine.API.loader == null) TTEngine.API.loader = new Loader();
//            //_gles = TTEngine.API.view.GL;
//            //TTEngine.API.mainwindow.ResizeAndCenter((int)(800 * Scale), (int)(600 * Scale));
//            this._input = new Impl_Input();
//            _gfxthreadid = System.Threading.Thread.CurrentThread.ManagedThreadId;
//        }
//        int _thisfb;
//        DateTime lasttime = DateTime.Now;
//        protected override void OnOpenGlRender(GlInterface gl, int fb)
//        {
//            _thisfb = fb;
//            //_gles.Viewport(0, 0, (uint)(this.Width* Scale), (uint)(this.Height*Scale));
//            //_gles.ClearColor(1, 0.5f, 0.8f, 1);
//            //_gles.Clear(ClearBufferMask.ColorBufferBit);
//            _gfxrange = true;
//            TTEngine.Runtime.activeGL = _gles;
//            ParseGFXSafeCall();

//            var ntim = DateTime.Now;
//            float delta = (float)(ntim - lasttime).TotalSeconds;
//            lasttime = ntim;
//            this.OnUpdate?.Invoke(delta);
//            this.OnRender?.Invoke();
//            _gfxrange = false;
//            TTEngine.Runtime.activeGL = null;
//            _gles.Flush();
//            this.RequestNextFrameRendering();
//        }
//        protected override void OnOpenGlDeinit(GlInterface gl)
//        {
//            base.OnOpenGlDeinit(gl);
//        }

//        protected override void OnSizeChanged(SizeChangedEventArgs e)
//        {
//            base.OnSizeChanged(e);

//            //防止单数尺寸
//            //bool needresize = false;
//            //int newheight = (int)e.NewSize.Height;
//            //int newwidth = (int)e.NewSize.Width;
//            //if (newheight % 2 == 1)
//            //{
//            //    this.GetWindow().Height = newheight - 1;
//            //    needresize = true;
//            //}
//            //if (newwidth % 2 == 1)
//            //{
//            //    this.GetWindow().Width = newwidth - 1;
//            //    needresize = true;
//            //}
//            //if (needresize)
//            //{
//            //    return;
//            //}

//            OnResize?.Invoke((int)(e.NewSize.Width * Scale), (int)(e.NewSize.Height * Scale));
//        }
//        bool _gfxrange;
//        int _gfxthreadid;
//        System.Collections.Concurrent.ConcurrentQueue<Action<IGLES>> safegfxqueue = new System.Collections.Concurrent.ConcurrentQueue<Action<IGLES>>();
//        public void InvokeGfxThread(Action<IGLES> action)
//        {
//            if (System.Threading.Thread.CurrentThread.ManagedThreadId == _gfxthreadid && _gfxrange)
//            {
//                action(this.GL);
//            }
//            else
//            {
//                safegfxqueue.Enqueue(action);
//            }
//        }

//        public async Task InvokeGfxThreadAsync(Action<IGLES> action)
//        {
//            bool finish = false;
//            InvokeGfxThread((_gl) =>
//            {
//                action(_gl);
//                finish = true;
//            });
//            while (!finish)
//            {
//                await Task.Delay(1);//等一帧，直到完成
//            }
//            return;
//        }

//        void ParseGFXSafeCall()
//        {
//            //执行GFX Action
//            int ic = safegfxqueue.Count;
//            for (var i = 0; i < ic; i++)
//            {
//                if (safegfxqueue.TryDequeue(out Action<IGLES> action))
//                {
//                    action(GL);
//                }
//            }
//        }


//        public bool IsMainOutput()
//        {
//            return true;
//        }

//        public void Apply()
//        {
//            Runtime.activeTarget = this;
//            _gles.BindFramebuffer(FramebufferTarget.Framebuffer, (uint)this._thisfb);
//            ISize size = this;
//            _gles.Viewport(0, 0, size.Width, size.Height);
//        }

//        public void Clear(TTMath.Color color)
//        {
//            _gles.ClearColor(color.r, color.g, color.b, color.a);
//            _gles.DepthMask(true);
//            _gles.ClearDepth(1.0f);
//            _gles.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);
//        }

//    }
//}
